/*
let fn = function(a,b) {
     console.log(a+b);
};
fn(4,6);
*/
// 箭头函数 无function关键字 在函数参数与函数体之间用箭头连接 
let fn = (a,b)=>{
    console.log(a+b);
};
fn(4,6);

// 当函数只有一个形参 小括号可以省略
let fn2 = a=>{
    console.log(a);
};
fn2(4);

/*
let fn3 = (m,n)=>{
    return m+n;
};*/
// 上面的只有一条return语句 可以简写为下面的省略大括号
/*let fn3 = (m,n)=>m+n;
console.log(fn3(4,8));
*/
// 可以给形参设置默认值
let fn3 = (m=0,n=0)=>m+n;
console.log(fn3(4));

let fun = x=>y=>x+y;
let res = fun(5)(6);
console.log(res); // 11
/*
  function fun(x) {
      return function(y) {
          return x+y;
      }
  }
*/

// 1 箭头函数内部没有arguments
/*
function fn() {
    console.log(arguments);
}
*/
// ... 剩余运算符 
let fn4 = (a,...arguments)=>{
    console.log(arguments); // 数组
}

fn4(1,2,3,4);

// 2 箭头函数中没有自己的执行主体this
/*
let obj = {
    fn:(function() {
        console.log(this); // window
        let _this = this;
        return function() {
            console.log(_this);
        }
    })()
};
//obj.fn();// 对象打点调用 那么函数中的this就是这个对象
//obj.fn.call(window); // 普通函数可以通过call去改变this
//obj.fn();
*/
//箭头函数的this和执行环境有关，继承上下文 无法通过call/apply/bind改变箭头
// 函数的this
let obj = {
    fn:(function() {
        return ()=>{
            console.log(this);
        }
    })()
};
obj.fn.call(obj);
